home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / xwindows / demos / xfract_1.z / xfract_1 / xfractint-1.06 / realdos.c < prev    next >
C/C++ Source or Header  |  1992-09-28  |  50KB  |  1,719 lines

  1. /*
  2.     Miscellaneous C routines used only in DOS Fractint.
  3. */
  4.  
  5. #include <string.h>
  6. #include <stdio.h>
  7. #ifndef XFRACT
  8. #include <dos.h>
  9. #include <io.h>
  10. #include <process.h>
  11. #endif
  12. #include <sys/types.h>
  13. #include <sys/stat.h>
  14. #include <fcntl.h>
  15. #include <math.h>
  16. #include <stdlib.h>
  17. #include <ctype.h>
  18. #include "fractint.h"
  19. #include "fractype.h"
  20. #include "helpdefs.h"
  21. #include "prototyp.h"
  22.  
  23. /* routines in this module    */
  24.  
  25. static int menu_checkkey(int curkey,int choice);
  26.  
  27. int release=1727; /* this has 2 implied decimals; increment it every synch */
  28. int xrelease=106;
  29.  
  30. /* fullscreen_choice options */
  31. #define CHOICERETURNKEY 1
  32. #define CHOICEMENU    2
  33. #define CHOICEHELP    4
  34.  
  35. extern int  xdots, ydots, sxdots, sydots, sxoffs, syoffs;
  36. extern int  colors;
  37. extern int  dotmode;
  38. extern int  oktoprint;
  39. extern int  textrow, textcol, textrbase, textcbase;
  40. extern int  debugflag;
  41. extern int  fractype;
  42. extern int  calc_status;
  43. extern double param[];
  44. extern int  tabmode;
  45. extern int  color_dark,color_medium,color_bright;
  46. extern int  lookatmouse;
  47. extern int  gotrealdac;
  48. extern int  reallyega;
  49. extern int  extraseg;
  50. extern int  active_system;
  51. extern int  first_init;
  52.  
  53.  
  54. /* int stopmsg(flags,message) displays message and waits for a key:
  55.      message should be a max of 9 lines with \n's separating them;
  56.        no leading or trailing \n's in message;
  57.        no line longer than 76 chars for best appearance;
  58.      flag options:
  59.        &1 if already in text display mode, stackscreen is not called
  60.       and message is displayed at (12,0) instead of (4,0)
  61.        &2 if continue/cancel indication is to be returned;
  62.       when not set, "Any key to continue..." is displayed
  63.       when set, "Escape to cancel, any other key to continue..."
  64.       -1 is returned for cancel, 0 for continue
  65.        &4 set to suppress buzzer
  66.        &8 for Fractint for Windows & parser - use a fixed pitch font
  67.       &16 for info only message (green box instead of red in DOS vsn)
  68.    */
  69. int stopmsg (int flags, CHAR far *msg)
  70. {
  71.    int ret,toprow,color,savelookatmouse;
  72.    if (active_system == 0 /* DOS */
  73.      && first_init) {      /* & cmdfiles hasn't finished 1st try */
  74.       setvideotext();
  75.       buzzer(2);
  76.       putstring(0,0,15,"*** Error during startup:");
  77.       putstring(2,0,15,msg);
  78.       movecursor(8,0);
  79. #ifdef XFRACT
  80.       sleep(1);
  81.       UnixDone();
  82. #endif
  83.       exit(1);
  84.       }
  85.    ret = 0;
  86.    savelookatmouse = lookatmouse;
  87.    lookatmouse = -13;
  88.    if ((flags & 1))
  89.       blankrows(toprow=12,10,7);
  90.    else {
  91.       stackscreen();
  92.       toprow = 4;
  93.       movecursor(4,0);
  94.       }
  95.    textcbase = 2; /* left margin is 2 */
  96.    putstring(toprow,0,7,msg);
  97.    if (flags & 2)
  98.       putstring(textrow+2,0,7,"Escape to cancel, any other key to continue...");
  99.    else
  100.       putstring(textrow+2,0,7,"Any key to continue...");
  101.    textcbase = 0; /* back to full line */
  102.    color = (flags & 16) ? C_STOP_INFO : C_STOP_ERR;
  103.    setattr(toprow,0,color,(textrow+1-toprow)*80);
  104.    movecursor(25,80);    /* cursor off */
  105.    if ((flags & 4) == 0)
  106.       buzzer((flags & 16) ? 0 : 2);
  107.    while (keypressed()) /* flush any keyahead */
  108.       getakey();
  109.    if (getakeynohelp() == ESC)
  110.       ret = -1;
  111.    if ((flags & 1))
  112.       blankrows(toprow,10,7);
  113.    else
  114.       unstackscreen();
  115.    lookatmouse = savelookatmouse;
  116.    return ret;
  117. }
  118.  
  119.  
  120. static char far *temptextsave = NULL;
  121. static int  textxdots,textydots;
  122.  
  123. /* texttempmsg(msg) displays a text message of up to 40 characters, waits
  124.       for a key press, restores the prior display, and returns (without
  125.       eating the key).
  126.       It works in almost any video mode - does nothing in some very odd cases
  127.       (HCGA hi-res with old bios), or when there isn't 10k of temp mem free. */
  128. int texttempmsg(char *msgparm)
  129. {
  130.    if (showtempmsg(msgparm))
  131.       return(-1);
  132. #ifndef XFRACT
  133.    while (!keypressed()) {} /* wait for a keystroke but don't eat it */
  134. #else
  135.    waitkeypressed(0); /* wait for a keystroke but don't eat it */
  136. #endif
  137.    cleartempmsg();
  138.    return(0);
  139. }
  140.  
  141. int showtempmsg(char *msgparm)
  142. {
  143.    extern int color_dark,color_medium;
  144.    CHAR msg[41];
  145.    BYTE buffer[640];
  146.    char far *fartmp;
  147.    BYTE far *fontptr;
  148.    BYTE *bufptr;
  149.    int i,j,k,xrepeat,yrepeat,fontchar,charnum;
  150.    int save_sxoffs,save_syoffs;
  151.    strncpy(msg,msgparm,40);
  152.    msg[40] = 0; /* ensure max message len of 40 chars */
  153.    if (dotmode == 11) { /* disk video, screen in text mode, easy */
  154.       dvid_status(0,msg);
  155.       return(0);
  156.       }
  157.    if ((fontptr = findfont(0)) == NULL) { /* old bios, no font table? */
  158.       if (oktoprint == 0           /* can't printf */
  159.     || sxdots > 640 || sydots > 200) /* not willing to trust char cell size */
  160.      return(-1); /* sorry, message not displayed */
  161.       textydots = 8;
  162.       textxdots = sxdots;
  163.       }
  164.    else {
  165.       xrepeat = (sxdots >= 640) ? 2 : 1;
  166.       yrepeat = (sydots >= 300) ? 2 : 1;
  167.       textxdots = strlen(msg) * xrepeat * 8;
  168.       textydots = yrepeat * 8;
  169.       }
  170.    /* worst case needs 10k */
  171.    if ((temptextsave = farmemalloc((long)textxdots * textydots)) == NULL)
  172.       return(-1); /* sorry, message not displayed */
  173.    save_sxoffs = sxoffs;
  174.    save_syoffs = syoffs;
  175.    sxoffs = syoffs = 0;
  176.    fartmp = temptextsave;
  177.    for (i = 0; i < textydots; ++i) {
  178.       get_line(i,0,textxdots-1,buffer);
  179.       for (j = 0; j < textxdots; ++j) /* copy it out to far memory */
  180.      *(fartmp++) = buffer[j];
  181.       }
  182.    if (fontptr == NULL) { /* bios must do it for us */
  183.       home();
  184.       printf(msg);
  185.       }
  186.    else { /* generate the characters */
  187.       find_special_colors(); /* get color_dark & color_medium set */
  188.       for (i = 0; i < 8; ++i) {
  189.      memset(buffer,color_dark,640);
  190.      bufptr = buffer;
  191.      charnum = -1;
  192.      while (msg[++charnum] != 0) {
  193.         fontchar = *(fontptr + msg[charnum]*8 + i);
  194.         for (j = 0; j < 8; ++j) {
  195.            for (k = 0; k < xrepeat; ++k) {
  196.           if ((fontchar & 0x80) != 0)
  197.              *bufptr = color_medium;
  198.           ++bufptr;
  199.           }
  200.            fontchar <<= 1;
  201.            }
  202.         }
  203.      for (j = 0; j < yrepeat; ++j)
  204.         put_line(i*yrepeat+j,0,textxdots-1,buffer);
  205.      }
  206.       }
  207.    sxoffs = save_sxoffs;
  208.    syoffs = save_syoffs;
  209.    return(0);
  210. }
  211.  
  212. void cleartempmsg()
  213. {
  214.    BYTE buffer[640];
  215.    char far *fartmp;
  216.    int i,j;
  217.    int save_sxoffs,save_syoffs;
  218.    if (dotmode == 11) /* disk video, easy */
  219.       dvid_status(0,"");
  220.    else if (temptextsave != NULL) {
  221.       save_sxoffs = sxoffs;
  222.       save_syoffs = syoffs;
  223.       sxoffs = syoffs = 0;
  224.       fartmp = temptextsave;
  225.       for (i = 0; i < textydots; ++i) {
  226.      for (j = 0; j < textxdots; ++j) /* copy back from far memory */
  227.         buffer[j] = *(fartmp++);
  228.      put_line(i,0,textxdots-1,buffer);
  229.      }
  230.       farmemfree(temptextsave);
  231.       temptextsave = NULL;
  232.       sxoffs = save_sxoffs;
  233.       syoffs = save_syoffs;
  234.       }
  235. }
  236.  
  237.  
  238. void blankrows(int row,int rows,int attr)
  239. {
  240.    char buf[81];
  241.    memset(buf,' ',80);
  242.    buf[80] = 0;
  243.    while (--rows >= 0)
  244.       putstring(row++,0,attr,buf);
  245.    }
  246.  
  247.  
  248. void helptitle()
  249. {
  250.    char msg[80],buf[10];
  251.    setclear(); /* clear the screen */
  252. #ifdef XFRACT
  253.    sprintf(msg,"XFRACTINT  Version %d.%02d (FRACTINT Version %d.%02d)",
  254.            xrelease/100,xrelease%100, release/100,release%100);
  255.    putstringcenter(0,0,80,C_TITLE,msg);
  256. #else
  257. #ifdef WAITE
  258.    sprintf(msg,"Special FRACTINT  Version %d.%01d",release/100,(release%100)/10);
  259. #else
  260.    sprintf(msg,"FRACTINT  Version %d.%01d",release/100,(release%100)/10);
  261. #endif
  262.    if (release%10) {
  263.       sprintf(buf,"%01d",release%10);
  264.       strcat(msg,buf);
  265.       }
  266. #ifdef WAITE /* realdos.c */
  267.    strcat(msg," for the Waite Group's Fractal Creations");
  268. #endif /* WAITE - realdos.c */
  269.    putstringcenter(0,0,80,C_TITLE,msg);
  270. #ifdef WAITE
  271.    return;
  272. #endif
  273. #endif
  274. /* uncomment next for production executable: */
  275.    return;
  276.    /*NOTREACHED*/
  277.    if (debugflag == 3002) return;
  278.    putstring(0,2,C_TITLE_DEV,"Development Version");
  279. /* replace above by next after creating production release, for release source */
  280. /* putstring(0,3,C_TITLE_DEV, "Customized Version"); */
  281.    putstring(0,53,C_TITLE_DEV,"Not for Public Release");
  282. }
  283.  
  284.  
  285. int putstringcenter(int row, int col, int width, int attr, char far *msg)
  286. {
  287.    char buf[81];
  288.    int i,j,k;
  289.    i = 0;
  290. #ifdef XFRACT
  291.    if (width==80) width=79; /* Some systems choke in column 80 */
  292. #endif
  293.    while (msg[i]) ++i; /* st